# -*- coding: utf-8 -*-

from pages.basePage import BaseHandler
import jinja2
import os
from models.usuario import Usuario
from models.mecanica import Mecanica
from models.persona import Persona
from models.cenario import Cenario as CenarioModel
import pages.oauth as oauth

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))

CONSUMER_KEY='RHIGaaaShak3AS5lAeasiI0VQipvwpD1GShY9j6S'
CONSUMER_SECRET='uYPvneXR4tDHLeJlE91jPRKiD5A4sFVaKeCU37If'
CALLBACL_URL="http://localhost:3000/redu"
REDU_CONSUMER = oauth.get_oauth_client(oauth.REDU, CONSUMER_KEY, CONSUMER_SECRET, CALLBACL_URL)

class PersonaCoisada:
    nome = None
    descricao = None
    pid = None
    
class MecanicaCoisada:
    nome = None
    tipo = None
    descricao = None
    mid = None

class Cenario(BaseHandler):
    def get(self):
        userId = self.session.get('userid')        
        user = None
        if userId is not None:
            user = Usuario.get_by_id(userId)
        if user is None:
            self.redirect('/')
            return
        url = self.session.get('url')
        if url is None:
            self.redirect('/')
            return
        
        cenarioId = self.request.get('cid')
        cenario = None
        if cenarioId:
            cenario = CenarioModel.get_by_id(long(cenarioId))
            
        vinc = self.request.get('vinc')
        personaId = self.request.get('pid')
        cineticaId = self.request.get('mid')
        
        if vinc:
            cenarioSessao = self.session.get('cenarioSessao')
            if not cenarioSessao:
                cenarioSessao = {'persona' : None, 'cineticas' : [], 'similares' : [], 'ideias' : None}
        else:
            cenarioSessao = {'persona' : None, 'cineticas' : [], 'similares' : [], 'ideias' : None}
                            
        self.session['cenarioSessao'] = cenarioSessao

        persona = None

        # Carregando Persona da url
        if personaId:
            self.session['cenarioSessao']['persona'] = long(personaId)
            persona = Persona.get_by_id(long(personaId))
        
        # Carregando Persona da sessão
        if not persona:
            personaId = self.session.get('cenarioSessao')['persona']
            if personaId:
                persona = Persona.get_by_id(long(personaId))
            
        # Caso não haja persona na sessão, tenta carregar a do cenário
        if not persona:
            if cenario and cenario.persona:
                persona = cenario.persona
                
        cineticas = []
        # Carregando cineticas da sessão
        cineticasIds = self.session['cenarioSessao']['cineticas']
        if cineticasIds:
            cineticas = Mecanica.get_by_id(cineticasIds)
            
        # Carregando cinéticas do cenário
        if cenario and cenario.cineticas:
            for cinetica in Mecanica.get(cenario.cineticas):
                cineticas.append(cinetica)

        similares = []
        # Carregando similares da sessão
        similaresIds = self.session['cenarioSessao']['similares']
        if similaresIds:
            similares = Persona.get_by_id(similaresIds)
            
        # Carregando similares do cenário
        if cenario and cenario.similares:
            for similar in Persona.get(cenario.similares):
                similares.append(similar)
            
        # Carregando lista de mecânicas da persona
        mecanicas = []
        if persona:
            mecanicas = Mecanica.get(persona.mecanicas)

        # Carregando lista de jogos dos similares
        jogos = []
        for similar in similares:
            mectemp = Mecanica.get(similar.mecanicas)
            for mec in mectemp:
                if mec.tipo == 'Jogo':
                    jogos.append(mec)
        
        # Montando template da persona para ser usado na tela
        personaCoisada = None
        if persona:
            personaCoisada = PersonaCoisada()
            personaCoisada.descricao = persona.descricao
            personaCoisada.nome = persona.nome
            personaCoisada.pid = persona.key().id()
        
        # Montando template das mecânicas para serem usados na tela
        mecanicasCoisadas = []
        for mecanica in mecanicas:
            mecanicaCoisada = MecanicaCoisada()
            mecanicaCoisada.descricao = mecanica.descricao
            mecanicaCoisada.nome = mecanica.nome
            mecanicaCoisada.tipo = mecanica.tipo
            mecanicaCoisada.mid = mecanica.key().id()
            mecanicasCoisadas.append(mecanicaCoisada)
            
        # Montando template dos jogos para serem usados na tela
        jogosCoisados = []
        for jogo in jogos:
            jogoCoisado = MecanicaCoisada()
            jogoCoisado.descricao = jogo.descricao
            jogoCoisado.nome = jogo.nome
            jogoCoisado.tipo = jogo.tipo
            jogoCoisado.mid = jogo.key().id()
            jogosCoisados.append(jogoCoisado)
           
        # Carregando idéias do cenário para mostrar na tela 
        ideias = ''
        if cenario and cenario.ideias:
            ideias = cenario.ideias
        
        # Montando lista com tipos de cartas de mecânica
        descricoesMecanicas = ['Lugar', 'Roupa', 'Filme', 'Hobby', 'Música', 'Jogo', 'Livro']
        mecanicasBreadas = [[],[],[],[],[],[],[]]
        for mecanica in mecanicasCoisadas:
            if mecanica.tipo == 'Lugar':
                mecanicasBreadas[0].append(mecanica)
            if mecanica.tipo == 'Roupa':
                mecanicasBreadas[1].append(mecanica)
            if mecanica.tipo == 'Filme':
                mecanicasBreadas[2].append(mecanica)
            if mecanica.tipo == 'Hobby':
                mecanicasBreadas[3].append(mecanica)
            if mecanica.tipo == 'Música':
                mecanicasBreadas[4].append(mecanica)
            if mecanica.tipo == 'Jogo':
                mecanicasBreadas[5].append(mecanica)
            if mecanica.tipo == 'Livro':
                mecanicasBreadas[6].append(mecanica)
                
        for i in range(0, 6):
            if len(mecanicasBreadas[i]) == 0:
                mecanicasBreadas[i] = None
        
        # Carregando lista de cinéticas para serem usadas na tela
        cineticasCoisadas = []
        for cinetica in cineticas:
            cineticaCoisada = MecanicaCoisada()
            cineticaCoisada.nome = cinetica.nome
            cineticaCoisada.tipo = cinetica.tipo
            cineticaCoisada.descricao = cinetica.descricao
            cineticaCoisada.mid = cinetica.key().id()
            cineticasCoisadas.append(cineticaCoisada)
        
        if len(jogosCoisados) == 0:
            jogosCoisados = None
        if len(cineticasCoisadas) == 0:
            cineticasCoisadas = None
        
        template_values = {
            'idCenario' : cenarioId,
            'user' : user,
            'persona' : personaCoisada,
            'mecanicas' : mecanicasBreadas,
            'descricoesMecanicas' : descricoesMecanicas,
            'jogos' : jogosCoisados,
            'cineticas' : cineticasCoisadas,
            'ideias' : ideias.encode('utf-8'),
            'url' : url
        }
            
        template = jinja_environment.get_template('html/mesapersonas.html')
        self.response.out.write(template.render(template_values))

    def post(self):
        userId = self.session.get('userid')        
        user = None
        if userId:
            user = Usuario.get_by_id(userId)
        if not user:
            self.redirect('/')
            return
        
        cenarioId = self.request.get('idCenario')
        cenario = None
        if cenarioId:
            cenario = CenarioModel.get_by_id(long(cenarioId))
            
        if not cenario:
            cenario = CenarioModel()
            cenario.usuarioCriador = user.key()
            cenario.put()
            
            # Postando no mural do Redu
            access_token = self.session.get('access_token')
            if access_token:
                json = REDU_CONSUMER.list_json('me', access_token)
                redu_user_id = json['id']
                REDU_CONSUMER.post_wall(redu_user_id, 'Acabei de criar um novo projeto em ' + self.request.url + '?cid=' + str(cenario.key().id()), access_token)

        # Vinculando carta de persona
        personaId = self.session['cenarioSessao']['persona']
        if personaId:
            persona = Persona.get_by_id(personaId)
            cenario.persona = persona.key()

        # Vinculando cartas de cinética
        cineticaIds = self.session['cenarioSessao']['cineticas']
        for cineticaId in cineticaIds:
            cinetica = Mecanica.get_by_id(cineticaId)
            if cenario.cineticas:
                cenario.cineticas.append(cinetica.key())
            else:
                cenario.cineticas = [cinetica.key()]
        
        # Vinculando cartas de personas similares   
        similaresIds = self.session['cenarioSessao']['similares']
        for similarId in similaresIds:
            similar = Persona.get_by_id(similarId)
            if cenario.similares:
                cenario.similares.append(similar.key())
            else:
                cenario.similares = [similar.key()]

        txtIdeias = self.request.get('txtAreaIdeias').encode('utf-8')
        cenario.ideias = txtIdeias
        cenario.put()
        
        self.session['cenarioSessao'] = None
        
        self.redirect('/cenario?cid=' + str(cenario.key().id()))